<?php if (!defined('INDEX')) { trigger_error("Index is not defined!", E_USER_ERROR); exit(); }
/**
 * Класс-обёртка для удобного хранения логики экспорта/импорта закладок
 * @package      habrabookmarks
 *
 * @author       Max Kamashev <max.kamashev@floscoeli.com>
 * @copyright    floscoeli.com ©2009
 * @license      http://opensource.org/licenses/gpl-3.0.html
 * @version      SVN: $Id: steps.php 43 2009-04-05 14:33:07Z M.Kamashev $
 *
 * settings:     ts: 4 spaces, eof: lf (unix), codepage: UTF-8
 */
class Steps {

    /**
     * Хранит заголовок текущего шага
     * @access private
     * @var String
     */
    private $_title;

    /**
     * Хранит содержимое страницы
     * @var String
     */
    private $_content = "";

    /**
     * Конструктор
     * @param $step_num int
     * @access public
     * @return void
     */
    public function __construct() {
        session_start();
        if (isset($_GET['clear'])) {
            session_destroy();
            header('Location: ' . URL); exit();
        }

        if (!isset($_SESSION['step'])) {
            $_SESSION['step'] = 1;
        }

        $this->_setTitle($_SESSION['step']);

        if ($_SESSION['step'] == 1) {
            $this->step1();
        } elseif ($_SESSION['step'] == 2) {
            $this->step2();
        }
    }

    /**
     * Устанавливает заголовок шага
     * @return void
     */
    private function _setTitle($step_num) {
        switch ($step_num) {
            case 1:
                $this->_title = "Первый Шаг. Выбираем «Откуда»";
                break;
            case 2:
                $this->_title = "Второй Шаг. «Выбираем импортируемые закладки»";
                break;
            default:
                $this->_title = "Первый Шаг. Выбираем «Откуда»";
                break;
        }
    }

    /**
     * Возвращает текущий заголовок шага
     * @return String
     */
    public function getTitle() {
        return $this->_title;
    }

    /**
     * Возвращает сформированный контент
     * @return String
     */
    public function getContent() {
        return $this->_content;
    }

    /**
     * Показывает сохранённые закладки
     * @return void
     */
    public function _showBookmarks() {
        $bookmarks_array = "";
        foreach ($_SESSION['bookmarks'] as $key => $var) {
            $bookmarks_array .= "<div id='".md5($var['link'])."'>
                <div id='' style='display:block;'>
                    <h3><a href='{$var['link']}'>{$var['header']}</a></h3>
                    <div><span class='date'>".date("d-m-Y", $var['date'])."</span>
                    <span class='toolbox'><a href='#'>редактировать</a> <a href='#'>удалить</a></span></div>
                    </div>
                    <div class='descr'>{$var['descr']}</div>
                    <span class='tags'>";
            foreach ($var['tags'] as $tag) {
                $bookmarks_array .= "<span class='tag'>{$tag}</span>";
            }
            $bookmarks_array .= "</span>
                    </div>
                </div>";
        }
        //$this->_content = "<form action='' method='post' style='text-align:left;'><div id='bookmarks'>{$bookmarks_array}</div></form>";
        $this->_content = "<div id='bookmarks'>{$bookmarks_array}</div>";
    }

    /**
     * Выводит форму с выбором экспортируемого или импортируемого сервиса
     * @param $type string
     * @return string
     */
    private function _renderSelect($type) {
        if ($type !== 'export' && $type !== 'import') {
            trigger_error("Передан неверный параметр при вызове метода.", E_USER_ERROR);
            return FALSE;
        }

        // Получаем массив с доступными сервисами
        $services = getServices();

        $var = "";
        $form ="";

        //XXX Может потом ещё включать обработку $_GET? (Обязательно включим! В следующих коммитах)
        if (isset($_POST[$type])){
            $var = $_POST[$type];
        }

        if (isset($_POST['service'])) {
            if (ereg("[A-Za-z0-9]+" , $_POST['service'])) {
                $currentService = $_POST['service'];
            } else {
                throw new Exception("Указано не корректное имя сервиса " . $_POST['service'], E_USER_ERROR);
            }
        } else {
            $currentService = "";
        }
        $firstShow = "";
        $selectService = "<form><div id='favicon'></div><select onchange=\"showInfo(this.value, '{$type}')\" name='selectService'>";
        foreach ($services as $key => $var) {
            if ($var[$type]) {
                if ($key == $currentService) {
                    $selectService .= "<option value='{$key}' selected style='background-image:url(services/ico/{$key}.ico);'>{$key}</option>";
                    $firstShow = "<fieldset><legend><img src='/services/ico/{$key}.ico' alt='' /> {$key}</legend>
                    <div id='{$type}_{$key}'><div><i>".$var['description']."</i></div>".$var[$type."Form"]."</div></fieldset>";
                } else {
                    $selectService .= "<option value='{$key}' style='background-image:url(services/ico/{$key}.ico);'>{$key}</option>";
                    if (!$firstShow) {
                        $firstShow = "<fieldset><legend><img src='/services/ico/{$key}.ico' alt='' /> {$key}</legend>
                        <div id='{$type}_{$key}'><div><i>".$var['description']."</i></div>".$var[$type."Form"]."</div></fieldset>";
                    }
                }
                $form .= "<div id='{$type}_{$key}'><div><i>".$var['description']."</i></div>".$var[$type."Form"]."</div>";
            }
        }
        $selectService .= "</select></form>";
        $this->_content .= "<h4>Пожалуйста, выберите из какого сервиса нужно импортировать закладки</h4>
        <p>{$selectService}</p>
        <p><div id='showForm'>{$firstShow}</div></p>
        <div style='display:none;'>{$form}</div>";
        return TRUE;
    }


    /**
     * Шаг третий и последний
     * @return void
     */
    public function step3() {

    }

    /**
     * Шаг второй
     * @return void
     */
    public function step2() {
         if (isset($_POST['service']) && !empty($_POST['service']) && $_POST['type'] == 'export') {
            try {
                if (ereg("[A-Za-z0-9]+" , $_POST['service'])) {
                    $service = new $_POST['service'];
                    if ($service->exportValidate()) {
                        $service->exportBookmarks($_SESSION['bookmarks']);
    //                    $this->_setTitle(3);
    //                    $_SESSION['step'] = 3;
    //                    return $this->step3();
                    }
                }
            } catch (Exception $e) {
                throw new Exception("Ошибка при экспорте: " . var_export($_POST, TRUE), E_USER_ERROR);
            }
        }
        //$this->_showBookmarks();
        $this->_renderSelect('export');
        $this->_content .= '<div style="text-align:right"><a href="?clear" style=\'color:#333333\'>очистить сохранённые данные</a></div>';
    }

    /**
     * Шаг первый, пользователь выбирает откуда скачать закладки К НАМ. (пока работает только с ХАБРОМ)
     * @return void
     */
    public function step1() {
        // Если пользователь уже что-то указал и отправил ПОСТ
        if (isset($_POST['service']) && !empty($_POST['service']) && $_POST['type'] == 'import') {
            try {
                if (ereg("[A-Za-z0-9]+" , $_POST['service'])) {
                    $service = new $_POST['service'];
                    if ($service->importValidate()) {
                        //TODO: Перевести массив закладок в класс закладок, со своим драйвером "storage"
                        $_SESSION['bookmarks'] = $service->importBookmarks();
                        $this->_setTitle(2);
                        $_SESSION['step'] = 2;
                        return $this->step2();
                    }
                } else {
                    throw new Exception("Не найден указанный сервис: " . var_export($_POST, TRUE), E_USER_ERROR);
                }
            } catch (Exception $e) {
                // Даём хабру право ещё раз заглючить (выдаёт пустые страницы, видимо это как-то связанно с системой кэширования),
                // и потом мы выводим уже настоящую ошибку
                try {
    				$this->step1();
                } catch (Exception $e) {
                    trigger_error("Ошибка при импорте: " . var_export($_POST, TRUE), E_USER_ERROR);
                }
            }
        }

        //Выводим комбо с выпадающим списком и ждём выбора пользователя
        $this->_renderSelect('import');

        return true;
    }
}
